#include "defectdao.h"

/*
 * //常用API:

1. addDatabase(const QString &driverName, const QString &connectionName = QLatin1String(defaultConnection))：添加一个数据库连接，driverName为驱动名称，connectionName为连接名称，默认为defaultConnection。
2. setDatabaseName(const QString &name)：设置数据库名称。
3. setUserName(const QString &userName)：设置用户名。
4. setPassword(const QString &password)：设置密码。
5. setHostName(const QString &hostName)：设置主机名。
6. setPort(int port)：设置端口号。
7. open()：打开数据库连接。
8. close()：关闭数据库连接。
9. isOpen()：判断数据库是否已经打开。
10. lastError()：获取最后一次出错的信息。
11. tables(QSql::TableType type = QSql::Tables)：获取数据库中的表名。
12. exec(const QString &query)：执行SQL语句。
13. prepare(const QString &query)：准备SQL语句。
14. bindValue(const QString &placeholder, const QVariant &val)：绑定值。
15. exec()：执行准备好的SQL语句。
16. next()：获取下一条记录。
17. value(int index)：获取指定列的值。
18. value(const QString &name)：获取指定列的值。
19. record()：获取当前记录。
20. rowCount()：获取记录总数。
21. lastInsertId()：获取最后插入数据的ID。
22. transaction()：开启事务。
23. commit()：提交事务。
24. rollback()：回滚事务。
*/

/*
1. exec()：执行SQL语句；
2. prepare()：准备SQL语句，但不执行；
3. bindValue()：将值绑定到SQL语句中的占位符；
4. next()：将查询结果集的指针移到下一行；
5. value()：获取当前行指定列的值；
6. record()：获取查询结果集的元数据，包括列名、类型等；
7. isActive()：判断查询是否处于活动状态；
8. lastError()：获取最后一次执行查询时发生的错误信息；
9. clear()：清除查询结果集和错误信息。
*/

/*// 1. 创建一个QSqlQuery对象
QSqlQuery query;
// 2. 准备SQL语句
QString sql = "SELECT * FROM my_table WHERE id = :id";
// 3. 绑定参数（可选）
query.bindValue(":id", 1);
// 4. 执行查询
query.exec(sql);
// 5. 处理结果
while (query.next())
{
    int id = query.value(0).toInt();
    QString name = query.value(1).toString();
    // 处理数据
}
// 6. 关闭查询
query.finish();
*/

DefectDao::DefectDao() {}

int DefectDao::insert(Defect &defect)
{
    // 插入数据
    QString insertQuery = "INSERT INTO defect(detectionid, type, x, y, w, h, note) VALUES "
                          "(:detectionid, :type, :x, :y, :w, :h,:note)";
    //qDebug() << insertQuery;
    query.prepare(insertQuery);
    query.bindValue(":detectionid", defect.getDetectionId());
    query.bindValue(":type", defect.getType());
    query.bindValue(":x", defect.getRect().x());
    query.bindValue(":y", defect.getRect().y());
    query.bindValue(":w", defect.getRect().width());
    query.bindValue(":h", defect.getRect().height());
    query.bindValue(":note", defect.getNote());
    qDebug() << QString("%1,%2,%3,%4,%5,%6,%7")
                    .arg(defect.getDetectionId())
                    .arg(defect.getType())
                    .arg(defect.getRect().x())
                    .arg(defect.getRect().y())
                    .arg(defect.getRect().width())
                    .arg(defect.getRect().height())
                    .arg(defect.getNote());

    if (!query.exec()) {
        qDebug() << QString("插入数据到 defect 表中失败，失败原因是：%1 。")
                        .arg(query.lastError().text());
        return -1;
    }
    qDebug() << QString("插入数据到 defect 表中成功，最后一条记录的id是：%1 。")
                    .arg(query.lastInsertId().toInt());
    return query.lastInsertId().toInt();
}

int DefectDao::updateByPrimay(Defect &defect)
{
    QString updateQuery = "UPDATE defect Set detectionid = ?, type = ?, x = ?, y = ?, w = ?, h = "
                          "?, note = ? where id = ?";
    //qDebug() << updateQuery;
    query.prepare(updateQuery);
    query.addBindValue(defect.getDetectionId());
    query.addBindValue(defect.getType());
    query.addBindValue(defect.getRect().x());
    query.addBindValue(defect.getRect().y());
    query.addBindValue(defect.getRect().width());
    query.addBindValue(defect.getRect().height());
    query.addBindValue(defect.getNote());
    query.addBindValue(defect.getId());
    qDebug() << QString("%1,%2,%3,%4,%5,%6,%7")
                    .arg(defect.getDetectionId())
                    .arg(defect.getType())
                    .arg(defect.getRect().x())
                    .arg(defect.getRect().y())
                    .arg(defect.getRect().width())
                    .arg(defect.getRect().height())
                    .arg(defect.getNote());

    if (!query.exec()) {
        qDebug() << QString("更新数据到 defect 表中失败，失败原因是：%1 。")
                        .arg(query.lastError().text());
        return -1;
    }
    return 1;
}

int DefectDao::deleteByPrimay(Defect &defect)
{
    QString deleteQuery = "DELETE FROM defect where id = ?";
    //qDebug() << deleteQuery;
    query.prepare(deleteQuery);
    query.addBindValue(defect.getId());
    qDebug() << QString("%1").arg(defect.getId());
    if (!query.exec()) {
        qDebug() << QString("删除表格 defect 数据失败，失败原因是：%1 。")
                        .arg(query.lastError().text());
        return -1;
    }
    return 1;
}

int DefectDao::queryAll(QList<Defect *> &list)
{
    QSqlQuery query;
    int count = 0;
    // 查询数据
    QString selectQuery = "SELECT * FROM defect";
    //qDebug() << selectQuery;
    if (!query.exec(selectQuery)) {
        qDebug() << QString("查询表格 defect 所有数据失败，失败原因是：%1 。")
                        .arg(query.lastError().text());
        return count;
    }

    while (query.next()) {
        count++;
        int id = query.value("id").toInt();
        int detectionid = query.value("detectionid").toInt();
        QString type = query.value("type").toString();
        float x = query.value("x").toFloat();
        float y = query.value("y").toFloat();
        float w = query.value("w").toFloat();
        float h = query.value("h").toFloat();
        QString note = query.value("note").toString();
        Defect *pDefect = new Defect(id, detectionid, type, QRectF(x, y, w, h), note);
        list.append(pDefect);
    }

    return count;
}

int DefectDao::queryByDetectionId(QList<Defect *> &list, int detectionId)
{
    QSqlQuery query;
    int count = 0;
    // 查询数据
    QString selectQuery = QString("SELECT * FROM defect where detectionid = '%1'").arg(detectionId);
    //qDebug() << selectQuery;
    if (!query.exec(selectQuery)) {
        qDebug() << QString("查询表格 defect 数据失败，失败原因是：%1 。")
                        .arg(query.lastError().text());
        return count;
    }

    while (query.next()) {
        count++;
        int id = query.value("id").toInt();
        int detectionid = query.value("detectionid").toInt();
        QString type = query.value("type").toString();
        float x = query.value("x").toFloat();
        float y = query.value("y").toFloat();
        float w = query.value("w").toFloat();
        float h = query.value("h").toFloat();
        QString note = query.value("note").toString();
        Defect *pDefect = new Defect(id, detectionid, type, QRectF(x, y, w, h), note);
        list.append(pDefect);
    }

    return count;
}
